import { changePasswordApi } from '@/api/user'
import type { FormInstance, FormRules } from 'element-plus'
import { reactive, ref } from 'vue'
// 定义表单数据接口
interface PasswordForm {
  password: string
  confirmPassword: string
}
export default function () {
  // 表单数据
  const passwordForm = ref<PasswordForm>({
    password: '',
    confirmPassword: '',
  })

  // 校验密码的规则
  const validatePassword = (rule: any, value: any, callback: any) => {
    // 非空校验
    if (value === '') {
      callback(new Error('密码不能为空'))
    } else if (value.length < 6 || value.length > 20) {
      // 长度校验：8-20位
      callback(new Error('密码长度应为6到20个字符'))
    } else if (!/(?=.*[a-zA-Z])/.test(value)) {
      // 至少一个字母
      callback(new Error('密码需包含至少一个字母'))
    } else if (!/(?=.*\d)/.test(value)) {
      // 至少一个数字
      callback(new Error('密码需包含至少一个数字'))
    } else {
      callback() // 校验通过
    }
  }

  // 校验确认密码的规则
  const validateConfirmPassword = (rule: any, value: any, callback: any) => {
    if (value === '') {
      callback(new Error('请确认新密码'))
    } else if (value !== passwordForm.value.password) {
      callback(new Error('两次输入的密码不一致'))
    } else {
      callback() // 校验通过
    }
  }

  // 表单校验规则
  const rules = reactive<FormRules<PasswordForm>>({
    password: [
      { validator: validatePassword, trigger: 'blur' },
      { required: true, message: '请输入密码', trigger: 'blur' },
    ],
    confirmPassword: [
      { validator: validateConfirmPassword, trigger: 'blur' },
      { required: true, message: '请输入密码', trigger: 'blur' },
    ],
  })

  // 修改密码
  const changePassword = async (formEl: FormInstance | undefined) => {
    // 如果表单校验不通过，直接返回
    if (!formEl) return
    await formEl.validate()
    try {
      // 调用接口
      const res = await changePasswordApi(
        passwordForm.value.password,
        passwordForm.value.confirmPassword,
      )
      if (res.code === 0) {
        // 修改成功
        ElMessage.success('修改密码成功')
        // 清空表单
        formEl!.resetFields()
      } else {
        // 修改失败
        ElMessage.error(res.msg)
      }
    } catch (error) {
      console.error('修改密码失败', error)
    }
  }

  // 取消操作
  const cancel = (formEl: FormInstance | undefined) => {
    if (formEl) {
      formEl.resetFields()
    }
  }
  return {
    passwordForm,
    rules,
    changePassword,
    cancel,
  }
}
